package com.kexio.dynamic.datasource.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据源切换注解
 * 
 * 用于方法或类上，指定使用特定的数据源
 * 
 * 使用示例：
 * <pre>
 * &#64;DS("slave")
 * public List&lt;User&gt; queryUsers() {
 *     // 这个方法会使用slave数据源
 * }
 * 
 * &#64;DS("tenant_${tenantId}")
 * public void saveData(Long tenantId, Object data) {
 *     // 动态数据源，基于租户ID
 * }
 * 
 * &#64;DS(value = "slave", readOnly = true)
 * public List&lt;Report&gt; generateReport() {
 *     // 只读查询，使用从库
 * }
 * </pre>
 * 
 * @author Kexio
 * @since 1.0.0
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DS {

    /**
     * 数据源名称
     * 支持SpEL表达式，如: "tenant_${tenantId}"
     */
    String value() default "";

    /**
     * 是否只读
     * 如果为true，会自动选择读库
     */
    boolean readOnly() default false;

    /**
     * 数据源类型
     */
    DSType type() default DSType.AUTO;

    /**
     * 是否强制切换
     * 如果为true，即使当前已有数据源也会强制切换
     */
    boolean force() default false;

    /**
     * 失败策略
     */
    FailureStrategy onFailure() default FailureStrategy.FALLBACK_TO_DEFAULT;

    /**
     * 描述信息
     */
    String description() default "";

    /**
     * 数据源类型枚举
     */
    enum DSType {
        /**
         * 自动选择（根据readOnly等条件）
         */
        AUTO,
        
        /**
         * 主库
         */
        MASTER,
        
        /**
         * 从库
         */
        SLAVE,
        
        /**
         * 租户库
         */
        TENANT,
        
        /**
         * 自定义
         */
        CUSTOM
    }

    /**
     * 失败策略枚举
     */
    enum FailureStrategy {
        /**
         * 回退到默认数据源
         */
        FALLBACK_TO_DEFAULT,
        
        /**
         * 抛出异常
         */
        THROW_EXCEPTION,
        
        /**
         * 忽略（使用当前数据源）
         */
        IGNORE
    }
}
